#include "NonJoueur.h"

NonJoueur::NonJoueur(int id):Personnage(id)
{
    state_=ATTENDRE;
    objectif_defini_=false;
    creerDroide();

}

NonJoueur::~NonJoueur()
{
    //dtor
}

NonJoueur::NonJoueur(int x, int y,int id,TextManager* txtmngr):Personnage(x,y,'S',id),txtmngr_(txtmngr)
{
    state_=ATTENDRE;
    objectif_defini_=false;
    base_=pos_;
    creerDroide();

}

void NonJoueur::ia(Joueur* j,Map* const m)
{

    position joueur=j->getPos();
    int distance=AStar::distance(pos_, joueur);
    switch(state_){
        case SUIVRE_JOUEUR:
            if(m->checkLOS(pos_,joueur) && distance<15 )
            state_=SUIVRE_JOUEUR;
            else
            state_=ENQUETER;
        break;
        case ENQUETER:
            if(m->checkLOS(pos_,joueur) && distance<15 )
                state_=SUIVRE_JOUEUR;
            else if(objectif_defini_)
                state_=ENQUETER;
            else
                state_=PATROUILLE;
        break;
        case PATROUILLE:
            if(m->checkLOS(pos_,joueur) && distance<15 )
                state_=SUIVRE_JOUEUR;
            else
                state_=PATROUILLE;
        break;
        default:
            state_=PATROUILLE;
        break;
    }
    agirSelonState(joueur,m);

}
void NonJoueur::agirSelonState(position joueur,Map* const m)
{
    int dir=randab(0,4);
    switch(state_){
        case SUIVRE_JOUEUR:
            objectif_=joueur;
            aStarAction(joueur,m);
            objectif_defini_=true;
        break;
        case ENQUETER:
            aStarAction(objectif_,m);
        break;
        case RANDOMWALK:

            while(!(m->estAccessible(pos_,dir)))
                dir=randab(0,4);

            deplacer(dir);
        break;
        case PATROUILLE:
            if(!objectif_defini_){
                if(objectif_==base_){
                    objectif_=m->randomPositionInterieur();
                    objectif_defini_=true;
                    base_=pos_;
                }else{
                    objectif_defini_=true;
                    objectif_=base_;
                }
            }
            if(randab(0,10)!=0)
                aStarAction(objectif_,m);
        break;
        default:
        break;
    }


}
void NonJoueur::aStarAction(position joueur,Map* const m)
{
    position p=pos_;
    if(p!=objectif_ ){
        if(chemin_.empty() || objectif_!=chemin_.front() || p_prevu_!=p ){
        int costmap[NY][NX];
        m->getCostMap(costmap);
        AStar a(p,objectif_,costmap);

        a.a_star();
        chemin_=a.chemin();
        }

        deplacer(chemin_.back());
        p_prevu_=chemin_.back();
        chemin_.pop_back();



}else{
    objectif_defini_=false;

}

}

void NonJoueur::creerStorm()
{
    vie_=Objets::XdY(2,6)+4;
    arme_=new Armes(4);
    armure_=new Armure(1);
    jambiere_=new Jambiere(3);
    casque_=new Casque(1);
    sprite_='S';
}

void NonJoueur::creerDroide()
{
    vie_=Objets::XdY(4,5)+3;
    defense_=4;
    sprite_='D';
    arme_=new Armes(rand()%4+1);
    armure_=new Armure(1);
    jambiere_=new Jambiere(3);
    casque_=new Casque(1);
}

void NonJoueur::creerMercenaire()
{
    vie_=Objets::XdY(1,8)+2;
    sprite_='M';
}
